/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mamesoft.namibiamc.beans;

import com.mamesoft.namibiamc.tools.JDBC;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import hirondelle.date4j.DateTime;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.TimeZone;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.event.ActionEvent;

/**
 *
 * @author simone
 */
public class DatiPazienteBean implements Serializable{

    private LoginBean loginBean;
    private int id = -1;
    private String nome = null;
    private String cognome = null;
    private String sesso = null;
    private String dataNascita = null;
    private String luogoNascita = null;
    private String indirizzo = null;
    private String cap = null;
    private String longitudine = null;
    private String latitudine = null;
    private boolean dbAccessed = false;
    private String email = null;
    private String telefono = null;
    private String foto = null;
    private String genitore = null;
    private String medico = null;
    private String capoVillaggio = null;
    private String eta = null;
    private boolean renderMap = false;
    private String buttonMessage = "Visualizza Mappa";
    private String data;
    private String tipo;
    private String descrizione;
    private String fatta;
    private int richiami;

    public List<DatiPazienteBean> listCartella() {
        Connection c = null;
        try {
            ArrayList<DatiPazienteBean> l = new ArrayList<DatiPazienteBean>();
            c = JDBC.connect();
            String q = "SELECT data,tipo_visita,descrizione,richiami FROM cartella WHERE pId='" + getId() + "' AND is_fatta='T' ORDER BY data DESC";
            ResultSet set = JDBC.executeQuery(q, c);
            while (set.next()) {
                DatiPazienteBean cb = new DatiPazienteBean();
                Timestamp t = set.getTimestamp("data");
                DateTime d = new DateTime(t.toString());
                cb.setData(d.format("DD/MM/YYYY hh:mm:ss"));
                cb.setTipo(set.getString("tipo_visita"));
                cb.setDescrizione(set.getString("descrizione"));
                cb.setRichiami(set.getInt("richiami"));
                l.add(cb);
            }
            return l;
        } catch (Exception ex) {
            return null;
        } finally {
            if (c != null) {
                try {
                    c.close();
                } catch (Exception ex) {
                }
            }
        }

    }

    public List<DatiPazienteBean> listPazienti() {
        try {
            ArrayList<DatiPazienteBean> l = new ArrayList<DatiPazienteBean>();
            Connection c = JDBC.connect();
            String q = "SELECT a2.ID,a2.nome,a2.cognome,a2.sesso,a2.data_nascita,foto FROM anagrafe AS a1"
                    + " JOIN paziente ON a1.id = medico"
                    + " JOIN anagrafe AS a2 ON a2.id = paziente.id"
                    + " WHERE medico = '" + getLoginBean().getId() + "'";
            ResultSet set = JDBC.executeQuery(q, c);
            while (set.next()) {
                DatiPazienteBean pb = new DatiPazienteBean();
                pb.setId(set.getInt("a2.ID"));
                pb.setNome(set.getString("nome"));
                pb.setCognome(set.getString("cognome"));
                pb.setSesso(set.getString("sesso"));
                Timestamp t = set.getTimestamp("data_nascita");
                DateTime f = new DateTime(t.toString());
                pb.setDataNascita(f.format("DD/MM/YYYY"));
                pb.setFoto(set.getString("foto"));
                DateTime today = DateTime.today(TimeZone.getDefault());
                int age = today.getYear() - f.getYear();
                if (today.getDayOfYear() < f.getDayOfYear()) {
                    age = age - 1;
                }
                pb.setEta(String.valueOf(age));
                l.add(pb);
            }
            return l;
        } catch (Exception ex) {
            Logger.getLogger(DatiPazienteBean.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public void toggleMap() {
        if (getButtonMessage().equals("Visualizza Mappa")) {
            setButtonMessage("Nascondi Mappa");
        } else {
            setButtonMessage("Visualizza Mappa");
        }
        setRenderMap(!isRenderMap());

    }

    public void actionListener(ActionEvent event) {
        Integer pazId = (Integer) event.getComponent().getAttributes().get("input_id");
        id = pazId;
        try {
            Connection c = JDBC.connect();
            String q = "SELECT nome,cognome,sesso,data_nascita,luogo_nascita,indirizzo,cap,longitudine,latitudine FROM anagrafe WHERE id='" + pazId + "';";
            ResultSet set = JDBC.executeQuery(q, c);
            if (set.next()) {
                setNome(set.getString("nome"));
                setCognome(set.getString("cognome"));
                setSesso(set.getString("sesso"));
                setLuogoNascita(set.getString("luogo_nascita"));
                setIndirizzo(set.getString("indirizzo"));
                setCap(set.getString("cap"));
                setLongitudine(set.getString("longitudine"));
                setLatitudine(set.getString("latitudine"));
                Timestamp t = set.getTimestamp("data_nascita");
                DateTime f = new DateTime(t.toString());
                setDataNascita(f.format("DD/MM/YYYY"));
                setDbAccessed(true);
            }

            q = "SELECT email,telefono,foto,genitore,medico,capo_villaggio FROM paziente WHERE id='" + pazId + "'";
            set = JDBC.executeQuery(q, c);
            if (set.next()) {
                setEmail(set.getString("email"));
                setTelefono(set.getString("telefono"));
                setFoto(set.getString("foto"));
                int g = -1, m = -1, cV = -1;
                g = set.getInt("genitore");
                m = set.getInt("medico");
                cV = set.getInt("capo_villaggio");

                if (g != 0) {
                    q = "SELECT nome,cognome FROM anagrafe WHERE id='" + g + "'";
                    set = JDBC.executeQuery(q, c);
                    if (set.next()) {
                        setGenitore(set.getString("nome") + " " + set.getString("cognome"));
                    }
                }
                if (m != 0) {
                    q = "SELECT nome,cognome FROM anagrafe WHERE id='" + m + "'";
                    set = JDBC.executeQuery(q, c);
                    if (set.next()) {
                        setMedico(set.getString("nome") + " " + set.getString("cognome"));
                    }
                }
                if (cV != 0) {
                    q = "SELECT nome,cognome FROM anagrafe WHERE id='" + cV + "'";
                    set = JDBC.executeQuery(q, c);
                    if (set.next()) {
                        setCapoVillaggio(set.getString("nome") + " " + set.getString("cognome"));
                    }
                }

            }
            c.close();
            set.close();
        } catch (Exception ex) {
            Logger.getLogger(DatiPazienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void initBean() {
        try {
            Connection c = JDBC.connect();
            String q = "SELECT nome,cognome,sesso,data_nascita,luogo_nascita,indirizzo,cap,longitudine,latitudine FROM anagrafe WHERE id='" + getLoginBean().getId() + "';";
            ResultSet set = JDBC.executeQuery(q, c);
            if (set.next()) {
                setNome(set.getString("nome"));
                setCognome(set.getString("cognome"));
                setSesso(set.getString("sesso"));
                setLuogoNascita(set.getString("luogo_nascita"));
                setIndirizzo(set.getString("indirizzo"));
                setCap(set.getString("cap"));
                setLongitudine(set.getString("longitudine"));
                setLatitudine(set.getString("latitudine"));
                Timestamp t = set.getTimestamp("data_nascita");
                DateTime f = new DateTime(t.toString());
                setDataNascita(f.format("DD/MM/YYYY"));
                setDbAccessed(true);
            }

            q = "SELECT email,telefono,foto,genitore,medico,capo_villaggio FROM paziente WHERE id='" + getLoginBean().getId() + "'";
            set = JDBC.executeQuery(q, c);
            if (set.next()) {
                setEmail(set.getString("email"));
                setTelefono(set.getString("telefono"));
                setFoto(set.getString("foto"));
                int g = -1, m = -1, cV = -1;
                g = set.getInt("genitore");
                m = set.getInt("medico");
                cV = set.getInt("capo_villaggio");

                if (g != 0) {
                    q = "SELECT nome,cognome FROM anagrafe WHERE id='" + g + "'";
                    set = JDBC.executeQuery(q, c);
                    if (set.next()) {
                        setGenitore(set.getString("nome") + " " + set.getString("cognome"));
                    }
                }
                if (m != 0) {
                    q = "SELECT nome,cognome FROM anagrafe WHERE id='" + m + "'";
                    set = JDBC.executeQuery(q, c);
                    if (set.next()) {
                        setMedico(set.getString("nome") + " " + set.getString("cognome"));
                    }
                }
                if (cV != 0) {
                    q = "SELECT nome,cognome FROM anagrafe WHERE id='" + cV + "'";
                    set = JDBC.executeQuery(q, c);
                    if (set.next()) {
                        setCapoVillaggio(set.getString("nome") + " " + set.getString("cognome"));
                    }
                }

            }
            c.close();
            set.close();
        } catch (Exception ex) {
            Logger.getLogger(DatiPazienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * @return the nome
     */
    public String getNome() {
        if (nome == null && !isDbAccessed()) {
            initBean();
        }
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the cognome
     */
    public String getCognome() {
        if (cognome == null && !isDbAccessed()) {
            initBean();
        }
        return cognome;
    }

    /**
     * @param cognome the cognome to set
     */
    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    /**
     * @return the sesso
     */
    public String getSesso() {
        if (sesso == null && !isDbAccessed()) {
            initBean();
        }
        return sesso;
    }

    /**
     * @param sesso the sesso to set
     */
    public void setSesso(String sesso) {
        this.sesso = sesso;
    }

    /**
     * @return the dataNascita
     */
    public String getDataNascita() {
        if (dataNascita == null && !isDbAccessed()) {
            initBean();
        }
        return dataNascita;
    }

    /**
     * @param dataNascita the dataNascita to set
     */
    public void setDataNascita(String dataNascita) {
        this.dataNascita = dataNascita;
    }

    /**
     * @return the luogoNascita
     */
    public String getLuogoNascita() {
        if (luogoNascita == null && !isDbAccessed()) {
            initBean();
        }
        return luogoNascita;
    }

    /**
     * @param luogoNascita the luogoNascita to set
     */
    public void setLuogoNascita(String luogoNascita) {
        this.luogoNascita = luogoNascita;
    }

    /**
     * @return the indirizzo
     */
    public String getIndirizzo() {
        if (indirizzo == null && !isDbAccessed()) {
            initBean();
        }
        return indirizzo;
    }

    /**
     * @param indirizzo the indirizzo to set
     */
    public void setIndirizzo(String indirizzo) {
        this.indirizzo = indirizzo;
    }

    /**
     * @return the cap
     */
    public String getCap() {
        if (cap == null && !isDbAccessed()) {
            initBean();
        }
        return cap;
    }

    /**
     * @param cap the cap to set
     */
    public void setCap(String cap) {
        this.cap = cap;
    }

    /**
     * @return the longitudine
     */
    public String getLongitudine() {
        if (longitudine == null && !isDbAccessed()) {
            initBean();
        }
        return longitudine;
    }

    /**
     * @param longitudine the longitudine to set
     */
    public void setLongitudine(String longitudine) {
        this.longitudine = longitudine;
    }

    /**
     * @return the latitudine
     */
    public String getLatitudine() {
        if (latitudine == null && !isDbAccessed()) {
            initBean();
        }
        return latitudine;
    }

    /**
     * @param latitudine the latitudine to set
     */
    public void setLatitudine(String latitudine) {
        this.latitudine = latitudine;
    }

    /**
     * @return the loginBean
     */
    public LoginBean getLoginBean() {
        return loginBean;
    }

    /**
     * @param loginBean the loginBean to set
     */
    public void setLoginBean(LoginBean loginBean) {
        this.loginBean = loginBean;
    }

    /**
     * @return the dbAccessed
     */
    public boolean isDbAccessed() {
        return dbAccessed;
    }

    /**
     * @param dbAccessed the dbAccessed to set
     */
    public void setDbAccessed(boolean dbAccessed) {
        this.dbAccessed = dbAccessed;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        if (email == null && !isDbAccessed()) {
            initBean();
        }
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the telefono
     */
    public String getTelefono() {
        if (telefono == null && !isDbAccessed()) {
            initBean();
        }
        return telefono;
    }

    /**
     * @param telefono the telefono to set
     */
    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    /**
     * @return the foto
     */
    public String getFoto() {
        if (foto == null && !isDbAccessed()) {
            initBean();
        }
        return foto;
    }

    /**
     * @param foto the foto to set
     */
    public void setFoto(String foto) {
        this.foto = foto;
    }

    /**
     * @return the genitore
     */
    public String getGenitore() {
        if (genitore == null && !isDbAccessed()) {
            initBean();
        }
        return genitore;
    }

    /**
     * @param genitore the genitore to set
     */
    public void setGenitore(String genitore) {
        this.genitore = genitore;
    }

    /**
     * @return the medico
     */
    public String getMedico() {
        if (medico == null && !isDbAccessed()) {
            initBean();
        }
        return medico;
    }

    /**
     * @param medico the medico to set
     */
    public void setMedico(String medico) {
        this.medico = medico;
    }

    /**
     * @return the capoVillaggio
     */
    public String getCapoVillaggio() {
        if (capoVillaggio == null && !isDbAccessed()) {
            initBean();
        }
        return capoVillaggio;
    }

    /**
     * @param capoVillaggio the capoVillaggio to set
     */
    public void setCapoVillaggio(String capoVillaggio) {
        this.capoVillaggio = capoVillaggio;
    }

    /**
     * @return the eta
     */
    public String getEta() {
        return eta;
    }

    /**
     * @param eta the eta to set
     */
    public void setEta(String eta) {
        this.eta = eta;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the renderMap
     */
    public boolean isRenderMap() {
        return renderMap;
    }

    /**
     * @param renderMap the renderMap to set
     */
    public void setRenderMap(boolean renderMap) {
        this.renderMap = renderMap;
    }

    /**
     * @return the buttonMessage
     */
    public String getButtonMessage() {
        return buttonMessage;
    }

    /**
     * @param buttonMessage the buttonMessage to set
     */
    public void setButtonMessage(String buttonMessage) {
        this.buttonMessage = buttonMessage;
    }

    public boolean isButtonDisabled() {
        return (getLongitudine() == null || getLatitudine() == null);
    }

    /**
     * @return the data
     */
    public String getData() {
        return data;
    }

    /**
     * @param data the data to set
     */
    public void setData(String data) {
        this.data = data;
    }

    /**
     * @return the tipo
     */
    public String getTipo() {
        return tipo;
    }

    /**
     * @param tipo the tipo to set
     */
    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    /**
     * @return the descrizione
     */
    public String getDescrizione() {
        return descrizione;
    }

    /**
     * @param descrizione the descrizione to set
     */
    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }

    /**
     * @return the fatta
     */
    public String getFatta() {
        return fatta;
    }

    /**
     * @param fatta the fatta to set
     */
    public void setFatta(String fatta) {
        this.fatta = fatta;
    }

    /**
     * @return the richiami
     */
    public int getRichiami() {
        return richiami;
    }

    /**
     * @param richiami the richiami to set
     */
    public void setRichiami(int richiami) {
        this.richiami = richiami;
    }
}